﻿using System;
using System.Collections;
using System.Reflection;
using System.Text;
using WinForms.Framework.Core;
using WinForms.Framework.Utility;

namespace WinForms.Framework.Base
{
    /// <summary>
    /// DataTransferObject の基底クラスです。
    /// </summary>
    [Serializable]
    public abstract class DTOBase
    {
        /// <summary>
        /// 現在のオブジェクトを表す文字列を返します。
        /// </summary>
        /// <returns type="string">プロパティの名称および値を XML 形式に変換した文字列を返します。</returns>
        public override string ToString()
        {
            var xml = new StringBuilder();

            Type type = GetType();
            foreach (PropertyInfo property in type.GetProperties())
            {
                string name = property.Name;
                object value = property.GetValue(this, null);

                if (value is ICollection)
                {
                    // コレクションの場合は値をフォーマットしてログに書き込みます。
                    xml.Append(Formater.CollectionToXml(name, (ICollection)value));
                }
                else
                {
                    // コレクション以外の場合は値をそのままログに書き込みます。
                    xml.Append(string.Format("<{0}>{1}</{0}>", name, value));
                }
            }

            return xml.ToString();
        }
    }
}
